#ifndef __CUSTOM_SVCNODE_H__
#define __CUSTOM_SVCNODE_H__

__BEGIN_DECLS

/*----- 监控错误码 -----*/
#define SNMON_ERR_OK                    "0000"  /* 成功 */

#define SNMON_ERR_COMM_FAIL             "9000"  /* 通信错误 */
#define SNMON_ERR_CMD_INVALID           "9001"  /* 无效命令 */
#define SNMON_ERR_CMD_NOT_FOUND         "9002"  /* 命令未存在 */
#define SNMON_ERR_SHUTDOWN_UNFINISH     "9005"  /* 关闭未完全 */
#define SNMON_ERR_PARA                  "9006"  /* 参数错误 */

/*----- 常量 -----*/
/* basic */
#define SN_LOG_DEF_SERVER_PORT      10000   /* 缺省服务端口 */
#define SN_LOG_DEF_MONITOR_PORT     10001   /* 缺省监控端口 */

#define SN_PASSWD_DEF_SERVER_PORT   10010   /* 缺省服务端口 */
#define SN_PASSWD_DEF_MONITOR_PORT  10011   /* 缺省监控端口 */

#define SN_SESSION_DEF_SERVER_PORT  10020   /* 缺省服务端口 */
#define SN_SESSION_DEF_MONITOR_PORT 10021   /* 缺省监控端口 */

#define SN_SECURE_DEF_SERVER_PORT   10030   /* 缺省服务端口 */
#define SN_SECURE_DEF_MONITOR_PORT  10031   /* 缺省监控端口 */
#define SN_SECURE_PLAIN_MAX_SIZE    KB(256) /* 明文最大长度 */
#define SN_SECURE_ENC_MAX_SIZE      (PARA_ITEM_MAX_SIZE/2) /* 密文最大长度 */
#define SN_SECURE_SIGN_MAX_SIZE     KB(4)   /* 签名最大长度 */

#define SN_MAILFWD_DEF_SERVER_PORT  10040   /* 缺省服务端口 */
#define SN_MAILFWD_DEF_MONITOR_PORT 10041   /* 缺省监控端口 */

#define SN_CONFIRM_DEF_SERVER_PORT  10050   /* 缺省服务端口 */
#define SN_CONFIRM_DEF_MONITOR_PORT 10051   /* 缺省监控端口 */

/* custom */

struct _svcnode;
typedef struct _svcnode *SVCNODE;
enum { SN_MODE_PERMANENT, SN_MODE_ONESHOT };

/*
 * 创建服务节点接口
 */
extern int  /* 0:成功 */
sn_create(
        char *addr,             /* [IN] 主机地址 */
        unsigned int mode,      /* [IN] 模式 */
        SVCNODE *psn            /* [OUT] 接口 */
        );

/*
 * 在线服务数量
 */
extern int  /* 数量 */
sn_has_ready(
        SVCNODE sn              /* [IN] 接口 */
        );

/*
 * 后备服务是否存在
 */
extern int  /* 数量 */
sn_has_backup(
        SVCNODE sn              /* [IN] 接口 */
        );

/*
 * 释放服务节点接口
 */
extern void
sn_free(
        SVCNODE sn              /* [IN] 接口 */
        );
#define sn_destroy sn_free

/*
 * 调用服务
 */
extern int  /* 0:成功 -1:连接主机出错 -2:通信出错 */
sn_call(
        SVCNODE sn,             /* [IN] 接口 */
        char *svc,              /* [IN] 服务 */
        char *request,          /* [IN] 输入消息 */
        char *respond           /* [OUT] 输出消息 */
        );

/*
 * 手工调用服务
 */
extern int  /* 0:成功 -1:服务索引超出在线数量 -2:无后备服务
               -3:连接出错 -4:通信出错 */
sn_call_manual(
        SVCNODE sn,             /* [IN] 接口 */
        int manual_idx,         /* [IN] 服务索引 */
        char *svc,              /* [IN] 服务 */
        char *request,          /* [IN] 输入消息 */
        char *respond          /* [OUT] 输出消息 */
        );

/*
 * 发送邮件
 */
extern int  /* 0:成功 -1:mailfwd地址解析出错 -2:调用mailfwd出错 */
sn_sendmail(
        char *mailfwd_addr,     /* [IN] mailfwd地址 */
        char *mailto,           /* [IN] 接收者地址 */
        char *mailfrom,         /* [IN] 发送者地址 */
        char *replyto,          /* [IN] 回复地址 NULL:同发送地址 */
        char *subject,          /* [IN] 标题 */
        char *body              /* [IN] 内容 */
        );

/*
 * 发送VIP邮件
 */
extern int  /* 0:成功 -1:mailfwd地址解析出错 -2:调用mailfwd出错 */
sn_sendmail_vip(
        char *mailfwd_addr,     /* [IN] mailfwd地址 */
        char *mailto,           /* [IN] 接收者地址 */
        char *mailfrom,         /* [IN] 发送者地址 */
        char *replyto,          /* [IN] 回复地址 NULL:同发送地址 */
        char *subject,          /* [IN] 标题 */
        char *body              /* [IN] 内容 */
        );

__END_DECLS

#endif
